package com.anxin.registerManagement.config.realm;

import cn.hutool.core.util.ObjectUtil;
import com.anxin.registerManagement.util.jwt.JwtToken;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * @author 叶前呈
 * @date 2022/1/23 17:46
 * jwt既需要做认证，也需要授权，继承AuthorizingRealm
 */
public class JwtRealm extends AuthorizingRealm {

    /**
     * 限制这个realm只能验证jwtToken
     * @param token
     * @return
     */
    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof JwtToken;
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // TODO 首先判断token是否存在
        String jwtToken = (String) authenticationToken.getPrincipal();
        if (ObjectUtil.isEmpty(jwtToken)) {
            return null;
        }
        // TODO 解析token，获取用户名，查找用户名是否存在，这里解析的应该是学号，因为学号唯一

        // TODO 查看token是否过期


        // jwt 是直接验证 token数据，如果token合法就表示已登录，所以无需从数据库获取账号密码来比较
        return new SimpleAuthenticationInfo(authenticationToken.getPrincipal(), authenticationToken.getPrincipal().toString(), getName());
    }
}
